package demo;

import java.lang.reflect.Array;

class MyArray<E>{


    //public E[] boj2 = new E[3];
    //public E[] obj1 = (E[])new Object[3];



    //以后常用的 ！！！！ 官方 自己在用的手段
   /* public Object[] obj = new Object[3];

    public E getPos2(int pos) {
        return (E)obj[pos];
    }*/


    //不常用
    public E[] obj;
    public MyArray(Class<E> clazz, int capacity) {
        //反射
        obj = (E[]) Array.newInstance(clazz, capacity);
    }


    public E getPos(int pos) {
        return obj[pos];
    }
    public void setObj(int pos, E val) {
        obj[pos] = val;
    }
    public E[] getArray() {
        return obj;
    }
}

//泛型的上界
//泛型 ———— 引用类型，不能直接比较。
//泛型 继承了 接口
//这个接口 可以去比较引用类型 成功解决了这个问题
class Alg<E extends Comparable<E>>{
    public E findMax(E[] array){
        E max = array[0];
        for (int i = 1; i < array.length; i++) {
            if( max.compareTo(array[i]) < 0){
                max = array[i];
            }
        }
        return max;
    }
}

class A<E extends Number>{

}

//泛型方法
class Alg2{

    //给这个findMax方法 加 边界 ：<E extends Comparable<E>>
    public<E extends Comparable<E>> E findMax(E[] array){
        E max = array[0];
        for (int i = 1; i < array.length; i++) {
            if( max.compareTo(array[i]) < 0){
                max = array[i];
            }
        }
        return max;
    }
}

class Alg3{

    //加一个static
    public static<E extends Comparable<E>> E findMax(E[] array){
        E max = array[0];
        for (int i = 1; i < array.length; i++) {
            if( max.compareTo(array[i]) < 0){
                max = array[i];
            }
        }
        return max;
    }
}
public class Test1 {
    public static void main(String[] args) {
        Integer[] arrray = {1,4,5,6,98,52,36};
        //通过 类名 调用
        //不需要实例化了
        Integer x = Alg3.findMax(arrray);
        System.out.println(x);
    }
    public static void main4(String[] args) {
        Alg2 alg = new Alg2();
        Integer[] arrray = {1,4,5,6,98,52,36};

        //在findMax前面 指定参数类型
        Integer x = alg.<Integer>findMax(arrray);
        System.out.println(x);
    }
    public static void main3(String[] args) {
        A<Number> a1 = new A<>();
        A<Integer> a2 = new A<>();
        A<Double> a3 = new A<>();
        //String 不是Number中的子类
      //  A<String> a4 = new A<String>();
    }


    public static void main2(String[] args) {
        Alg<Integer> alg = new Alg<>();
        Integer[] arrray = {1,4,5,6,98,52,36};
        Integer x = alg.findMax(arrray);
        System.out.println(x);

    }
    public static void main1(String[] args) {
        MyArray<Integer> myArray = new MyArray<>(Integer.class,10);
        myArray.setObj(0,10);
        myArray.setObj(1,78);
        Integer[] integers = (Integer[])myArray.getArray();


    }
}
